<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Ресурсы</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.75.1">
<link rel="home" href="index.html" title="Руководство по Smarty">
<link rel="up" href="advanced.features.html" title="Chapter 15. Расширенные возможности">
<link rel="prev" href="section.template.cache.handler.func.html" title="Управление кэшированием">
<link rel="next" href="plugins.html" title="Chapter 16. Плагины - расширение функциональности Smarty">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">Ресурсы</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="section.template.cache.handler.func.html">Prev</a> </td>
<th width="60%" align="center">Chapter 15. Расширенные возможности</th>
<td width="20%" align="right"> <a accesskey="n" href="plugins.html">Next</a>
</td>
</tr>
</table>
<hr>
</div>
<div class="sect1" title="Ресурсы">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="template.resources"></a>Ресурсы</h2></div></div></div>
<p>
  Шаблоны можно получать из самых разных источников. Когда вы
  <a class="link" href="api.display.html" title="display()">отображаете</a> или
  <a class="link" href="api.fetch.html" title="fetch">вызываете</a> шаблон,
  либо когда вы подключаете один шаблон к другому, вы указываете тип ресурса,
  вместе с соответствующим путём и названием шаблона.
  Если тип ресурса явно не задан, используется значения свойства
  <a class="link" href="variable.default.resource.type.html" title="$default_resource_type">$default_resource_type</a>.
 </p>
<div class="sect2" title="Шаблоны из папки $template_dir">
<div class="titlepage"><div><div><h3 class="title">
<a name="templates.from.template.dir"></a>Шаблоны из папки $template_dir</h3></div></div></div>
<p>
   Шаблоны, которые находятся в папке
   <a class="link" href="api.variables.html#variable.template.dir" title="$template_dir">$template_dir</a>,
   не требуют при вызове указания
   типа ресурса, хотя вы можете использовать префикс file: для сохранения
   стиля. Для вызова просто укажите относительный от
   <a class="link" href="api.variables.html#variable.template.dir" title="$template_dir">$template_dir</a>
   путь к шаблону.
  </p>
<div class="example">
<a name="id2737102"></a><p class="title"><b>Example 15.6. Вызов шаблона из папки $template_dir</b></p>
<div class="example-contents"><pre class="programlisting">

&lt;?php
$smarty-&gt;display('index.tpl');
$smarty-&gt;display('admin/menu.tpl');
$smarty-&gt;display('file:admin/menu.tpl'); // тоже самое, что и строкой выше
?&gt;

{* код в шаблоне Smarty *}
{include file="index.tpl"}
{include file="file:index.tpl"} {* тоже самое, что и строкой выше *}

   </pre></div>
</div>
<br class="example-break">
</div>
<div class="sect2" title="Шаблоны из произвольной папки">
<div class="titlepage"><div><div><h3 class="title">
<a name="templates.from.any.dir"></a>Шаблоны из произвольной папки</h3></div></div></div>
<p>
   Для вызова шаблонов из папки вне
   <a class="link" href="api.variables.html#variable.template.dir" title="$template_dir">$template_dir</a>
   необходимо использовать префикс file: с последующим указанием асболютного
   пути и имени шаблона.
  </p>
<div class="example">
<a name="id2737419"></a><p class="title"><b>Example 15.7. Вызов шаблона из произвольной папки</b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
$smarty-&gt;display('file:/export/templates/index.tpl');
$smarty-&gt;display('file:/path/to/my/templates/menu.tpl');
?&gt;

   </pre>
<p>
    А изнутри шаблона Smarty:
   </p>
<pre class="programlisting">

{include file="file:/usr/local/share/templates/navigation.tpl"}

   </pre>
</div>
</div>
<br class="example-break"><div class="sect3" title="Файловые пути в Windows">
<div class="titlepage"><div><div><h4 class="title">
<a name="templates.windows.filepath"></a>Файловые пути в Windows</h4></div></div></div>
<p>
    Если вы работаете под Windows, то пути к файлам, как правило,
    начинаются с буквы логического диска (например, C:). Не забудьте
    указать префикс "file:" в начале пути, чтобы избежать конфликтов
    имён и достичь необходимого результата.
   </p>
<div class="example">
<a name="id2737476"></a><p class="title"><b>Example 15.8. использование шаблонов с файловіми путями Windows</b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
// PHP скрипт
$smarty-&gt;display('file:C:/export/templates/index.tpl');
$smarty-&gt;display('file:F:/path/to/my/templates/menu.tpl');
?&gt;

    </pre>
<p>
     А изнутри шаблона Smarty:
    </p>
<pre class="programlisting">

{include file="file:D:/usr/local/share/templates/navigation.tpl"}

    </pre>
</div>
</div>
<br class="example-break">
</div>
</div>
<div class="sect2" title="Шаблоны из прочих источников">
<div class="titlepage"><div><div><h3 class="title">
<a name="templates.from.elsewhere"></a>Шаблоны из прочих источников</h3></div></div></div>
<p>
   Вы можете вызывать шаблоны, используя любые доступные через PHP источники:
   базы данных, сокеты, LDAP и так далее.
   Для этого нужно написать соответствующий плагин ресурса и зарегистрировать
   его в Smarty.
  </p>
<p>
   Смотрите раздел <a class="link" href="plugins.resources.html" title="Ресурсы">плагины ресурсов</a>
   для более подробной информации о тех функциях, которые вы должны
   предоставить.
  </p>
<div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;">
<h3 class="title">Note</h3>
<p>
    Обратите внимание на то, что вы не можете переопределить встроенный ресурс
    <code class="literal">file</code>, но в ваших силах написать и зарегистрировать ресурс с
    другим именем, который будет использовать другой способ вызова шаблонов из
    файловой системы.
   </p>
</div>
<div class="example">
<a name="id2737580"></a><p class="title"><b>Example 15.9. Использование собственных ресурсов</b></p>
<div class="example-contents">
<pre class="programlisting">

// код в вашем скрипте
function db_get_template ($tpl_name, &amp;$tpl_source, &amp;$smarty_obj)
{
    // обращаемся к базе, запрашиваем код шаблона,
    // перегружаем его в $tpl_source
    $sql = new SQL;
    $sql-&gt;query("select tpl_source
                   from my_table
                  where tpl_name='$tpl_name'");
    if ($sql-&gt;num_rows) {
        $tpl_source = $sql-&gt;record['tpl_source'];
        return true;
    } else {
        return false;
    }
}

function db_get_timestamp($tpl_name, &amp;$tpl_timestamp, &amp;$smarty_obj)
{
    // обращаемся к базе, запрашиваем поле $tpl_timestamp.
    $sql = new SQL;
    $sql-&gt;query("select tpl_timestamp
                   from my_table
                  where tpl_name='$tpl_name'");
    if ($sql-&gt;num_rows) {
        $tpl_timestamp = $sql-&gt;record['tpl_timestamp'];
        return true;
    } else {
        return false;
    }
}

function db_get_secure($tpl_name, &amp;$smarty_obj)
{
    // предполагаем, что наши шаблоны совершенно безопасны
    return true;
}

function db_get_trusted($tpl_name, &amp;$smarty_obj)
{
    // не используется для шаблонов
}

// регистрируем ресурс под именем "db"
$smarty-&gt;register_resource("db", array("db_get_template",
                                       "db_get_timestamp",
                                       "db_get_secure",
                                       "db_get_trusted"));

// используем ресурс из PHP скрипта
$smarty-&gt;display("db:index.tpl");
?&gt;

    </pre>
<p>
     А изнутри шаблона Smarty:
    </p>
<pre class="programlisting">

{include file="db:/extras/navigation.tpl"}

   </pre>
</div>
</div>
<br class="example-break">
</div>
<div class="sect2" title="Функция для обработки шаблона по умолчанию">
<div class="titlepage"><div><div><h3 class="title">
<a name="default.template.handler.function"></a>Функция для обработки шаблона по умолчанию</h3></div></div></div>
<p>
   Вы можете определить функцию, которая будет использована,
   если шаблон не может быть вызван из соответствующего ресурса.
   Это можно использовать, к примеру, для построения недостающего
   шаблона на лету.
  </p>
<div class="example">
<a name="id2737634"></a><p class="title"><b>Example 15.10. использование функции для обработки шаблона по умолчанию</b></p>
<div class="example-contents"><pre class="programlisting">

&lt;?php
// код в вашем скрипте

function make_template ($resource_type, $resource_name, &amp;$template_source, &amp;$template_timestamp, &amp;$smarty_obj)
{
	if( $resource_type == 'file' ) {
		if ( ! is_readable ( $resource_name )) {
			// создаём и записываем файл шаблона.
			$template_source = "Это новый шаблон.";
			$template_timestamp = time();
			$smarty_obj-&gt;_write_file($resource_name,$template_source);
			return true;
		}
    } else {
		// не файл
		return false;
    }
}

// определение обработчика
$smarty-&gt;default_template_handler_func = 'make_template';
?&gt;

   </pre></div>
</div>
<br class="example-break">
</div>
</div>
<div class="navfooter">
<hr>
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="section.template.cache.handler.func.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="advanced.features.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="plugins.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">Управление кэшированием </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td>
<td width="40%" align="right" valign="top"> Chapter 16. Плагины - расширение функциональности Smarty</td>
</tr>
</table>
</div>
</body>
</html>
